<?php
namespace App\Admin\Controller;

use Entities\Corp\Perfil;
use Foxforms\Widget\Field\Select;
use Foxforms\Widget\Field\Input;
use Foxforms\Widget\Form;

class perfilController extends \Foxframe\Controller
{
	public function index($params = array())
	{
		$this->redirect(BASE_PATH.'admin/perfil/viewListar');
	}

	public function viewListar($params = array())
	{
		$lista = $this->em->getRepository('Entities\Corp\Perfil')->listar();
		$this->view->assign('lista', $lista);
		$this->view->assign('label', "Perfis cadastrados");
	}

	public function viewCadastrar($params = array())
	{
		if (isset($params['id_perfil']) && !empty($params['id_perfil']))
			$perfil	= $this->em->find('\Entities\Corp\Perfil', $params['id_perfil']);
		else
			$perfil	= new \Entities\Corp\Perfil();

		$form	= new Form();
		$form->addValues($perfil, 'perfil');
		$form->addClass('validate');
		$form->addElement(Input::create('application')->setType('hidden')->setValue('admin'));
		$form->addElement(Input::create('controller')->setType('hidden')->setValue('perfil'));
		$form->addElement(Input::create('method')->setType('hidden')->setValue('savePerfil'));
		$form->addElement(Input::create('perfil[version]')->setType('hidden'));
		$form->addElement(Input::create('perfil[id_perfil]')->setType('hidden'));
		$form->addElement(Input::create('perfil[ds_nome]')->setLabel('Descrição')->validate()->addClass('input-xlarge'));
		$form->addElement(Input::create('salvar')->setType('submit')->setValue('Salvar')->addClass(array('btn','btn-primary')));
		$this->view->assign('form', $form);

		return $this->returnAjax();
	}

	public function savePerfil($params = array())
	{
		try
		{
			$service	= new \Foxframe\Service();
			$perfil		= $service->save($params['perfil'], '\Entities\Corp\Perfil');
			$this->em->flush();

			$this->setFlash('Success', 'Sucesso', 'Perfil salvo com sucesso');
		}
		catch (\Exception $e)
		{
			$this->setFlash('Error', 'Erro ao salvar perfil', $e->getMessage());
		}
		$this->redirect($this->uri->getOrigem());
	}

	public function viewVincularUsuario($params = array())
	{
		$perfil	= $this->em->find('\Entities\Corp\Perfil', $params['id_perfil']);

		$atuais	= array(0);
		foreach ($perfil->getUsuarios() as $usuario)
		{
			$atuais[]	= $usuario->getId();
		}
		$atuais	= implode(',', $atuais);

		$form	= new Form();
		$form->addValues($perfil, 'perfil');
		$form->addClass('validate');
		$form->addElement(Input::create('application')->setType('hidden')->setValue('admin'));
		$form->addElement(Input::create('controller')->setType('hidden')->setValue('perfil'));
		$form->addElement(Input::create('method')->setType('hidden')->setValue('saveVincularUsuario'));
		$form->addElement(Input::create('perfil[id_perfil]')->setType('hidden'));
		$equal	= array(
				'p.fl_status'	=> 1
			);
		$notIn	= array(
				'p.id_pessoa'	=> $atuais
			);
		$form->addElement(
				Select::create('perfil[usuarios][]')
				->setLabel('Usuários')
				->multiple()
				->setPlaceHolder('Selecione os usuários')
				->addClass('input-xxlarge select2')
				->setOption($this->em->getRepository('\Entities\Corp\PessoaFisica')->listCombo($equal,$notIn))
		);
		$form->addElement(Input::create('salvar')->setType('submit')->setValue('Salvar')->addClass(array('btn','btn-primary')));
		$this->view->assign('form', $form);
		$this->view->assign('perfil', $perfil);
	}

	public function saveVincularUsuario($params = array())
	{
		try
		{
			if (isset($params['perfil']['id_perfil']) && !empty($params['perfil']['id_perfil']))
				$perfil	= $this->em->find('\Entities\Corp\Perfil', $params['perfil']['id_perfil']);
			else
				throw new \Exception('Perfil não encontrado');

			if (isset($params['perfil']['usuarios']))
			{
				foreach ($params['perfil']['usuarios'] as $usuarios)
				{
					$pessoa = $this->em->find('\Entities\Corp\Pessoa', $usuarios);
					$perfil->addUsuario($pessoa);
				}
			}
			else if (isset($params['pessoa']['idpessoa']))
			{
				$pessoa = $this->em->find('\Entities\Corp\Pessoa', $params['pessoa']['idpessoa']);
				$perfil->addUsuario($pessoa);
			}
			$this->em->persist($perfil);
			$this->em->flush();

			$this->setFlash('Success', 'Sucesso', 'Perfil salvo com sucesso');
		}
		catch (\Exception $e)
		{
			$this->setFlash('Error', 'Erro ao salvar perfil', $e->getMessage());
		}
		$this->redirect($this->uri->getOrigem());
	}

	public function viewVincularMetodo($params = array())
	{
		$perfil	= $this->em->find('\Entities\Corp\Perfil', $params['id_perfil']);
		$form	= new Form();
		$form->addValues($perfil, 'perfil');
		$form->addElement(Input::create('application')->setType('hidden')->setValue('admin'));
		$form->addElement(Input::create('controller')->setType('hidden')->setValue('perfil'));
		$form->addElement(Input::create('method')->setType('hidden')->setValue('saveVincularMetodo'));
		$form->addElement(Input::create('perfil[version]')->setType('hidden')->validate());
		$form->addElement(Input::create('perfil[id_perfil]')->setType('hidden')->validate());
		$form->addElement(
				Select::create('perfil[aplicacao]')
				->setLabel('Aplicacao')
				->setOption($this->em->getRepository('\Entities\Corp\Aplicacao')->listCombo())
				->setPlaceHolder('-- Selecione --')
				->validate()
		);
		$form->addElement(
				Select::create('perfil[ds_controller]')
				->setLabel('Especialidade')
				->setPlaceHolder('-- Selecione --')
				->validate()
		);
		$form->addElement(
				Select::create('perfil[ds_method]')
				->setLabel('Ação')
				->setPlaceHolder('-- Selecione --')
				->validate()
		);
		$form->addElement(Input::create('salvar')->setType('submit')->setValue('Salvar')->addClass(array('btn','btn-primary')));
		$this->view->assign('form', $form);
		$this->view->assign('perfil', $perfil);
	}

	public function saveVincularMetodo($params = array())
	{
		try
		{
			$perfil		= $this->em->find('\Entities\Corp\Perfil', $params['perfil']['id_perfil']);
			$aplicacao	= $this->em->find('\Entities\Corp\Aplicacao', $params['perfil']['aplicacao']);

			$acao	= new \Entities\Corp\PerfilAcao();
			$acao->setPerfil($perfil);
			$acao->setAplicacao($aplicacao);
			$acao->setDsMethod($params['perfil']['ds_method']);
			$acao->setDsController($params['perfil']['ds_controller']);

			$this->em->persist($acao);
			$this->em->flush();

			$this->setFlash('Success', 'Sucesso', 'Permissão salva com sucesso');
		}
		catch (\Exception $e)
		{
			$this->setFlash('Error', 'Erro ao salvar permissão', $e->getMessage());
		}
		$this->redirect($this->uri->getOrigem());
	}

	public function deletePermissao($params = array())
	{
		try
		{
			$service 	= new \Foxframe\Service();
			$service->delete($params['id'], '\Entities\Corp\PerfilAcao');
			$this->em->flush();

			$this->setFlash('Success', 'Sucesso', 'Permissão excluída com sucesso');
		}
		catch (\Exception $e)
		{
			$this->setFlash('Error', 'Erro ao excluir permissão');
		}
		$this->redirect($this->uri->getOrigem());
	}

	public function excluirUsuario($params = array())
	{
		try
		{
			$usuario	= $this->em->getRepository('\Entities\Corp\Pessoa')->find($params['id_usuario']);
			$perfil		= $this->em->getRepository('\Entities\Corp\Perfil')->find($params['id_perfil']);
			$perfil->getUsuarios()->removeElement($usuario);
			$this->em->flush();

			$this->setFlash('Success', 'Sucesso', 'Usuário removido do grupo de acesso com sucesso');
		}
		catch (\Exception $e)
		{
			$this->setFlash('Error', 'Erro ao remover usuário do grupo'.$e->getMessage());
		}
		$this->redirect($this->uri->getOrigem());
	}
}